Démonstration sur le wiki de
PostgreSQL:
https://wiki.postgresql.org/wiki/
Turing_Machine_(with_recursive)
Advent of code 2017: https://github.com/xocolatl/advent-of-code/tree/master/2017
Fournir la liste des membres du club avec la personne qui les a recommendés (s'ils sont recommendés).
select mem."firstname" || ' ' || mem."surname",
( select memref."firstname" || ' ' || memref."surname" from members as memref where mem."recommendedby" = memref."memid" )
from members as mem
(dans la clause select)
<query specification> ::= SELECT [ <set
quantifier> ] <select
list> <table expression>
<select
list> ::=
<asterisk>
| <select sublist> [ {
<comma> <select sublist> }... ]
<select sublist> ::=
<derived column>
| <qualified asterisk>
<derived
column> ::=
<value expression> [
<as clause> ]
<value expression> ::=
<numeric value expression>
| <string value expression>
| <datetime value expression>
| <interval value expression>
| <boolean value expression>
| <user-defined type value expression>
| <row value expression>
| <reference value
expression>
| <collection value expression>
<reference value expression> ::=
<value expression
primary>
<value expression primary> ::=
<parenthesized value expression> | <nonparenthesized value expression
primary>
<nonparenthesized value expression primary>
::=
<unsigned value specification>
| <column reference>
| <set function specification>
| <scalar subquery>
| <case expression>
| <cast specification>
| <subtype treatment>
| <attribute or method reference>
| <reference resolution>
| <collection value constructor>
| <routine invocation>
| <field reference>
| <element reference>
| <method invocation>
| <static method invocation>
| <new specification>
<scalar subquery> ::= <subquery>
<subquery> ::=
<left paren> <query
expression> <right paren>
The degree
of a <scalar subquery> shall be 1 (one)
with memref as ( select "firstname" || ' ' || "surname" as refname from members )
select mem."firstname" || ' ' || mem."surname",
memref.refname
from members as mem
left outer join memref on mem."recommendedby" = memref."memid"
with
<query expression> ::=
[ <with clause> ]
<query expression body>
[ <order by clause> ]
[ <result offset clause> ]
[ <fetch first clause> ]
<with
clause> ::=
WITH [ RECURSIVE ] <with
list>
<with list> ::=
<with list element> [ {
<comma> <with list element> }...
]
<with
list element> ::=
<query name> [ <left paren> <with column
list> <right paren> ]
AS <table subquery> [
<search or cycle clause> ]
select
mem."firstname"
|| ' ' ||
mem."surname",
memref."firstname"
|| ' ' ||
memref."surname"
from
"members" as mem
left outer join
"members" as memref
on mem."recommendedby" = memref."memid"
select mem."firstname", mem."surname",
( select memref."firstname", memref."surname", from members as memref where mem."recommendedby" = memref."memid" )
from members as mem
select mem."firstname", mem."surname",
memref."firstname", memref."surname"
from members as mem
left join lateral (select "firstname", "surname" from members as mentors where mentors.memid = mem.recommendedby) as memref on true
<query expression> ::=
[ <with clause> ]
<query expression
body>
<query
expression body> ::=
<non-join query expression>
| <joined table>
<joined table> ::= <cross join>
| <qualified join>
| <natural join>
| <union join>
<qualified join>
::=
<table reference> [ <join type> ] JOIN
<table reference>
<join specification>
<table reference> ::=
<table primary> |
<joined table>
<table primary> ::=
<table or query name> [ [ AS ] <correlation
name>
[ <left paren> <derived column list>
<right paren> ] ]
| <derived table> [ AS ] <correlation
name>
[ <left paren> <derived column list>
<right paren> ]
| <lateral derived
table> [ AS ] <correlation name>
[ <left paren> <derived column list>
<right paren> ]
| <collection derived table> [ AS ] <correlation
name>
[ <left paren> <derived column list>
<right paren> ]
| <only spec>
[ [ AS ] <correlation name>
[ <left paren> <derived column list>
<right paren> ] ]
| <left paren> <joined table> <right
paren>
<lateral derived table> ::=
LATERAL <left paren> <query
expression> <right paren>
<join specification> ::=
<join condition>
| <named columns join>
<join
condition> ::= ON <search
condition>
<search
condition> ::=
<boolean value
expression>
Fournir la liste des membres du club qui s'appellent David, Tim ou Darren.
select "firstname", "surname" from members
where "firstname" in ('David', 'Tim', 'Darren')
insert into ("column1",...) values (...);
values ('Hello world');
select "firstname", "surname" from members
inner join values (('David'),('Tim'),('Darren')) as people(firstname) on members."firstname" = people."firstname"
<query expression> ::=
<non-join query
expression>
| <joined table>
<non-join query expression>
::=
<non-join query
term>
| <query expression> UNION [ ALL ] [
<corresponding spec> ] <query term>
| <query expression> EXCEPT [ ALL ] [
<corresponding spec> ] <query term>
<non-join query term> ::=
<non-join query
primary>
| <query term> INTERSECT [ ALL ] [
<corresponding spec> ] <query
primary>
<non-join query primary>
::=
<simple table>
| <left paren> <non-join query expression>
<right paren>
<simple table> ::=
<query specification>
| <table value
constructor> | <explicit
table>
<table value constructor>
::=
VALUES <table value constructor
list>
Fournir la liste des membres du club qui n'ont jamais réservé d'équipement.
select surname, firstname from members
where "memid" not in ( select memid from bookings )
select surname, firstname from members
where not exists ( select 1 from bookings where bookings.memid = members.memid )
select surname, firstname from members
left outer join "bookings" on "members"."memid" = "bookings"."memid" where "bookings".memid is null
Pour l'année 2012, fournir la durée de réservation par mois pour chaque équipement, puis le total sur l'année pour chaque équipement, puis le total pour tous les équipements
facid | month | duration |
---|---|---|
1 | January | 7.5 |
1 | February | 4 |
... | ... | ... |
1 | null | 45 |
2 | January | 17 |
... | ... | ... |
null | null | 138 |
select "facid", extract(month from starttime), sum(slots) from "bookings" where extract(year from starttime) = 2012 group by factid, extract(month from starttime)
union select "facid", null, sum(slots) from "bookings" where extract(year from starttime) = 2012 group by factid
union select null, null, sum(slots) from "bookings" where extract(year from starttime) = 2012
select facid, extract(month from starttime), sum(slots) as slots from cd.bookings where extract(year from starttime) = 2012
group by rollup("facid", extract(month from "starttime")) order by "facid", extract(month from "starttime")
<group by clause> ::=
GROUP BY <grouping
specification>
<grouping specification>
::=
<grouping column reference>
| <rollup list>
| <cube list>
| <grouping sets list>
| <grand total>
| <concatenated grouping>
<rollup list> ::=
ROLLUP <left paren>
<grouping column reference list> <right
paren>
Fournir le nombre total de membres du club ainsi que les noms et prénoms de chaque membre (par ordre de date d'adhésion).
Surname | Last Name | Number |
---|---|---|
Ada | Lovelace | 47 |
Grace | Hopper | 47 |
Margaret | Hamilton | 47 |
... | ... | 47 |
select (
select count(*) from members
) as count, firstname, surname from members order by joindate
select count(*)
over(),
"firstname", "surname" from members order by joindate
<window function> ::= <window function
type> OVER <window name or
specification>
<window name or
specification> ::=
<window name>
| <in-line window
specification>
<in-line window
specification> ::= <window
specification>
<window specification> ::=
<left paren> <window
specification details> <right
paren>
<window specification
details> ::=
[ <existing window name> ]
[ <window partition clause> ]
[ <window order clause> ]
[ <window frame clause> ]
Pour le membre d'id 27, fournir les noms/prénoms de tous les membres qui l'ont recommandé (directement ou indirectement)
with recursive recommenders(recommender) as (
select recommendedby from cd.members where memid = 27
union all select mems.recommendedby from recommenders recs inner join cd.members mems on mems.memid = recs.recommender
)
select recs.recommender, mems.firstname, mems.surname from recommenders recs inner join cd.members mems on recs.recommender = mems.memid order by memid desc